package com.jms.framework.jdbc;

import javax.sql.DataSource;

/**
 * DataSourceManagement 类用于管理和加载数据源
 * 它使用单例模式来确保在系统中只有一个数据源实例
 */
public class DataSourceManagement {
    // 使用 volatile 关键字确保多线程环境下该变量的可见性
    private static volatile DataSourceManagement defaultDataSource;
    // 存储数据源实例
    private DataSource dataSource;

    // 私有构造方法，防止外部实例化
    private DataSourceManagement() {
    }

    /**
     * 加载数据源方法
     *
     * @param dataSource 要加载的数据源实例
     * 通过此方法，可以在运行时动态地加载数据源
     */
    public void loadDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 获取 DataSourceManagement 单例方法
     *
     * @return DataSourceManagement 的单例实例
     * 实现了双重检查锁定（Double-Checked Locking）模式，以提高多线程环境下的性能
     */
    public static DataSourceManagement getInstance() {
        if (defaultDataSource == null) {
            synchronized (DataSourceManagement.class) {
                if (defaultDataSource == null) {
                    defaultDataSource = new DataSourceManagement();
                }
            }
        }
        return defaultDataSource;
    }

    /**
     * 获取当前加载的数据源方法
     *
     * @return 当前的数据源实例
     * 通过此方法，可以访问到加载的数据源，以便进行数据库操作
     */
    public DataSource getDataSource() {
        return dataSource;
    }
}
